'use strict';

/**
 * 将文本复制到剪贴板
 * @description 支持现代浏览器的 Clipboard API 和传统的 execCommand 方法
 * @param {string} text - 要复制的文本内容
 * @param {Object} [options] - 配置选项
 * @param {boolean} [options.fallbackToExecCommand=true] - 当 Clipboard API 不可用时是否使用 execCommand
 * @returns {Promise<string>} 返回一个 Promise，复制成功返回复制的内容，失败时 reject
 * @example
 * // 基本使用
 * copyText('要复制的文本')
 *   .then(text => console.log('复制成功:', text))
 *   .catch(error => console.error('复制失败:', error));
 *
 * // 使用 async/await
 * try {
 *   const text = await copyText('要复制的文本');
 *   console.log('复制成功:', text);
 * } catch (error) {
 *   console.error('复制失败:', error);
 * }
 */
const copyText = async (text, options = {}) => {
    const { fallbackToExecCommand = true } = options;
    // 检查输入
    if (typeof text !== 'string') {
        throw new Error('复制的内容必须是字符串类型');
    }
    // 尝试使用 Clipboard API
    if (navigator.clipboard && window.isSecureContext) {
        try {
            await navigator.clipboard.writeText(text);
            return text;
        }
        catch (error) {
            if (!fallbackToExecCommand) {
                throw new Error(`复制失败: ${error instanceof Error ? error.message : String(error)}`);
            }
        }
    }
    // 使用 execCommand 作为备用方法
    if (fallbackToExecCommand) {
        try {
            const textarea = document.createElement('textarea');
            // 优化性能：最小化重排
            textarea.style.position = 'fixed';
            textarea.style.opacity = '0';
            textarea.style.pointerEvents = 'none';
            textarea.value = text;
            document.body.appendChild(textarea);
            // 处理 iOS 设备
            if (navigator.userAgent.match(/ipad|iphone/i)) {
                textarea.contentEditable = 'true';
                textarea.readOnly = false;
                const range = document.createRange();
                range.selectNodeContents(textarea);
                const selection = window.getSelection();
                if (selection) {
                    selection.removeAllRanges();
                    selection.addRange(range);
                }
                textarea.setSelectionRange(0, textarea.value.length);
            }
            else {
                textarea.select();
            }
            const successful = document.execCommand('copy');
            document.body.removeChild(textarea);
            if (successful) {
                return text;
            }
            throw new Error('复制操作失败');
        }
        catch (error) {
            throw new Error(`复制失败: ${error instanceof Error ? error.message : String(error)}`);
        }
    }
    throw new Error('当前环境不支持复制操作');
};

exports.copyText = copyText;
